// import { filterGroup, filterMemberName } from '@/utils/filterName'
const emoJSON = require('@/mock/emojLocal.js')
import config from '../config'
import utils from "IM/utils/utils";

import store from '../store'

/**
 * getQueryVariable
 * @param variable 获取链接参数
 */
function getQueryVariable(variable) {
  var query = window.location.search.substring(1)
  var vars = query.split('&')
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split('=')
    if (pair[0] == variable) {
      return pair[1]
    }
  }
  return false
}
/**
 * emojReplace
 * @param string 获取表情包
 */
 export const emojReplace = string => {
  // 正则匹配表情, 即使将文字{微笑} 这样的替换成微笑图片
  // 获取标签图片
  string.replace(/{([^}]+)}/g, function(match) {
    let url = ''
    for (let i = 0; i < emoJSON[0].nodes.length; i++) {
      const element = emoJSON[0].nodes[i]
      if (element.name == match) {
        url = element.url
      }
    }
    let outHtml = ''
    // 判断是否为大表情
    // console.log(url, match, capture)
    outHtml = '<img src="' + url + '" class="face" />'
    string = string.replace(match, outHtml)
  })

  return string
}



/**
 *  判断是否是issend
 *  根据message.action 判断 ’0‘ 单聊  '3' 群聊
 */
function isSend(message){
  if(message.action == '0'){
    return store.state.user.id == message.sender;
  }
  if( ['3', '310','315'].includes(message.action)){
    return store.state.user.id == message.extra;
  }
  return store.state.user.id == message.sender;
}



/**
 *  
 *  对JSON 字符串进行转换成JSON 对象
 */

function parseJsonString(jsonString='{}'){
   var jsonObj;
   try{
    jsonObj = typeof jsonString == 'object' ? jsonString : JSON.parse(jsonString);
   }catch(err){
    jsonObj = {}
   } 
    return jsonObj;
}



/**
 * replyMsg 
 * @param {reply, message} 本地消息和获取的消息 的处理
 * sort 默认是往msgList 后面追加
 */
export function replyMsg(reply, message, sort='push') {
  // const path = window.location.pathname
  let msgLs
  let arrLS

  if(!message.content){
    message.content = '';
  }
  message.content = message.content.split('\n')
    .filter(item => !!item)
    .join('<br/>');
    
   if(message.format == '8') {
      message.content = parseJsonString(message.content);
   }
  // 过滤用户昵称和群成员昵称
  // const memberInfo = filterMemberName(  
  //   message.sender,
  //   message.extra,
  //   message.action
  // )
  let userInfo;  // 给每一个消息的头像用的
 // 已聊天消息处理， 会话列表存在这个reply
  if (reply) {
    msgLs = reply.msgList;
    let msgMember;
    // 群聊信息 ---- 这里要求已经存在的群 reply 必须要有memberList
    // 通过extra 取值
    if(['3', '302','310' ,'315', '300', '303', '313', '314', '307'].includes(message.action) ){
      let userId =  message.extra;
      if(['302','307'].includes(message.action)){
        userId = message.content;
      }
      msgMember = reply.memberList?.find(item=>item.uid == userId);  //  先在会话里面找，找不到从本地localStroage 里面找
      if(!msgMember){
        msgMember = utils.makeUserMap()?.find(item=>item.uid == userId);
      }
      userInfo = {
        id: userId,
        sourceId: userId,
        name: msgMember?.name
      }

      // 让message.title 转义一下
      try{
        message.title = JSON.parse(message.title)
      }catch(e){
        message.title = { at:[], qt:'' }
      }
      
    }


    // 单聊信息 中，会话名称就是发送用户的名称， 单聊撤回
    if(message.action == "0" || message.action == "101"){
      userInfo ={
        id:message.sender,  // 发送者的id
        sourceId: message.sender,
        name: store.state.user.id == message.sender ? store.state.user.name : reply.name
      }
     
    }
    
    // 待办任务消息 messageIds 长度分为3种情况， 0， 1, 2
    // 0 代表是全新的待办任务 1 代表这个待办之前存在过，现在是更改状态的ws  2 代表此待办存在同时有系统 和个人2个待办任务
    if(message.format == '8'){
       let msgId =  message.content?.messageId ? message.content?.messageId : '';
       let messageIds = msgId.split(',').filter(v=>v);
       let localExist = false;
       let loaclItem;
       messageIds.forEach(item=>{
            let msg = msgLs.find(v=> v.id == item);
            if(msg){
              localExist = true;
              loaclItem = msg;
            }

       })
       
       if(messageIds.length && !localExist) return reply;
       // 本地待办任务存在，要实时更新待办任务
       if(messageIds.length && localExist){
         message.isNew = false;
         loaclItem.content = message.content;
         return reply;
       }
       // 全新的消息信息
       if(!messageIds.length){
         message.isNew = true;
       }
    

    }

    arrLS = {
      id: message.id,  // 消息的id
      format: String(message.format) || '0',
      msgtype: String(message.format) || '0',
      action: message.action || '',
      sender: message.sender || '', // 个人相对发送人id
      issend: isSend(message),  // 是不是发送者， 决定左右布局
      seq: message.seq,         // 每个会话的连续序列， 应该是连续的
      receiver: message.receiver || '', // 接收人或者群id
      // author: memberInfo.name || '', // 发送人昵称
      unread: message.state !== 2,  // 只有为2 是已读
      timestamp: message.createTime || message.timestamp,  // 信息时间， 漫游就返回这个时间
      createTime: message.createTime || '',
      showTimestamp: false, // 是否展示时间戳
      deleted: message.deleted,
      msg: message.content || '',
      content: message.content || '',   // 消息内容
      // 图片消息或者视频封面图字段
      imgsrc:
        message.format == '1' || message.format == '3' || message.format == '5'
          ? config.baseUrl +
            '/file/hoxin-chat-space/' +  parseJsonString(message.content).image
          : '',
      videosrc: message.format == '3' ? parseJsonString(message.content).video : '',
      title: message.title || '',
      tips:'',
      extra: message.extra || '', // 群消息 记录发群消息成员的id
      fileName: message.format == '4' ? parseJsonString(message.content).name : '', // 附件名称
      fileSize: message.format == '4' ? parseJsonString(message.content).size : '', // 附件尺寸
      userInfo: userInfo,
    }
    // emoj 替换

    if (message.format == '0') {
      arrLS.msg = emojReplace(message.content)
    }
    // 单聊撤回
    if(message.action == "101"){
      let name = message.sender == store.state.user.id ? '你' : reply?.name;
      arrLS.tips = name + '撤回了一条消息';
    }

    // 退出
    if(message.action == "302"){
      let name = msgMember?.uid == store.state.user.id ? '你' : msgMember?.name;
      arrLS.msg = name + '退出了群聊';
      arrLS.tips = name + '退出了群聊';
    }

      // 群聊撤回
    if(message.action == "310"){
      let name = msgMember?.uid == store.state.user.id ? '你' : msgMember?.name;
      arrLS.tips = name + '撤回了一条消息';
    }

      
    // 被移除群聊 --- 需要后端给出名字
    if(message.action == "312"){      
      arrLS.tips = '被移出群';
    }

    // 如果是群公告
    if(message.action == "315"){
      let content = parseJsonString(message.content);
      arrLS.msg = content.content;
      arrLS.noticeId = content.noticeId;
    }
    
    // 如果是设置， 取消管理员
    if(["313", "314"].includes(message.action)){
      let tips =  message.action == "313" ? '成为管理员' : '被取消管理员权限';
      arrLS.tips = msgMember?.name + tips;
      reply.hasAll = false;
    }
    if(["307"].includes(message.action)){
      arrLS.tips = msgMember?.name + '成为群主';
      reply.hasAll = false;  // 说明需要更新了
    }



  } else {   // 会话列表不存在这个会话
  
    reply = {
      id: message.sender,
      sourceId: message.sender,
      sourceType: 1,
      msgList: [],
      groups: [], // 群成员
      // motto: memberInfo.motto, // 签名
      badge: 0,
      remove: false,
      uid: "",
      newmsgcount:0,
      message:'',      // 最新的一条消息的内容
      messageId: '',  // 最新的一条消息的id
      timestamp: message.timestamp || new Date().getTime(),  // 最近的一条消息时间
      type:"user",       // 会话的类型, 默认用户
      refer:{ 
              id :message.sender,
              sourceId:  message.sender, 
              name:"",
              avatar:"", 
              action: message.action 
            },  // 给会话列表的头像组件用
    
    }
  
    // 单聊信息
    if(message.action == "0"){
      reply.type = "user"; // 会话的类型, 系统消息也是
      reply.sourceType = 1;
      // 给消息用的, extra 是实际发送者的id 
      userInfo = {
        id:  message.sender,
        sourceId:  message.sender,
      }
    
    }
    // 群聊消息
    if(message.action == "3" ||  message.action == "315"){
      reply.type = "group"; // 会话的类型
      reply.sourceType = 2;
      reply.memberList=[];  // 群成员信息   
      // 给消息用的, extra 是实际发送者的id 
      userInfo = {
        id: message.action == "3" ? message.extra : message.sender,
        sourceId: message.action == "3" ? message.extra : message.sender,
      }
    
    }

    msgLs = reply.msgList
    arrLS = {
      id: message.id,
      format: message.format, // 消息类型 图片 视频 文件 文字
      msgtype:message.format || '0',
      action: message.action,
      sender: message.sender,
      issend:  isSend(message),
      seq: message.seq,
      receiver: message.receiver,
      unread: message.state !== 2,  // 已读和未读
      timestamp: message.timestamp || '',  // 消息时间戳
      showTimestamp: false, // 是否展示时间戳
      deleted: message.deleted,  // 该信息是否已经删除， 包含单聊删除  单聊撤回  群聊 销毁 群聊撤回等情况
      createTime: message.createTime || '',
      msg: message.content,
      content: message.content || '',
      imgsrc:
        message.format == '1' || message.format == '3' || message.format == '5'
          ? config.baseUrl +
            '/file/hoxin-chat-space/' +
            JSON.parse(message.content).image
          : '',
      videosrc: message.format == '3' ? JSON.parse(message.content).video : '',
      emojsrc: message.format == '15' ? JSON.parse(message.content).itemId : '',
      title: message.title,
      tips:'',
      extra: message.extra,
      fileName: message.format == '4' ? JSON.parse(message.content).name : '',
      fileSize: message.format == '4' ? JSON.parse(message.content).size : '',
      userInfo: userInfo,
    }

    // 如果是群公告
    if(message.action == "315"){
      let content = JSON.parse(message.content);
      arrLS.msg = content.content;
      arrLS.noticeId = content.noticeId;
    }

    // 表情发送format 也是0， 然后将特殊的表情文字用本地的图片给替代
    if (message.format == '0') {
      arrLS.msg = emojReplace(message.content)
    }



  }


  

  // 只返回消息本身，不进行任何插入
  if(sort== 'onlyMsg') return arrLS;
  // 将新消息message 添加到reply.msgList 中去, 默认是后面追加
  if(sort == 'push' || !sort){
    msgLs = msgLs.concat(arrLS) 
  }
  if(sort == 'unshift'){
    msgLs.unshift(arrLS) 
  }
  
  reply.msgList = msgLs
  return reply
}
